const dotenv = require('dotenv');
const result = dotenv.config();
if (result.error) {
    throw result.error;
}
const retry = require('bluebird-retry');
const retryPromise = require('bluebird');
const config = require('./config');
const MetamonApi = require('./metamon_api');
const Web3 = require('web3');

let wait = ms => new Promise(resolve => setTimeout(resolve, ms));
let metamonApi = new MetamonApi(config.address, config.chain, config.privateKey);

async function run() {
    console.log("Raca-Metamon自动升级属性脚本启动，当前账号: " + config.address);
    if (config.accessToken) {
        metamonApi.setAccessToken(config.accessToken);
    } else {
        /// 程序登录，设置accessToken
        let accessToken = await metamonApi.login();
        metamonApi.setAccessToken(accessToken);
    }


    let timeOut = config.loopSeconds * 1000;
    let count = 1;
    (function iterator() {
        runThis(count).then(() => {
            setTimeout(() => {
                count++;
                iterator();
            }, timeOut);
        }).catch((err) => {
            console.log(`error: ${err.message}`);
            console.log(err);
            setTimeout(() => {
                count++;
                iterator();
            }, timeOut);
        })
    })();
}

async function runThis(count) {
    console.log("============================程序开始第" + count + "次扫描==============================");
    try {
        
        /// 查询背包获取药水数量
        let potions = await getNft(2, metamonApi);
        console.log("当前药水数量" + potions.bpNum);
        let isUpper = 0;
        

        let m1 = await metamonApi.getMetamonList();
        let m2 = await metamonApi.getKingdomMonsterList();
        let metamons = m1.concat(m2);
        console.log(`元兽总数：${metamons.length}，元兽岛：${m1.length}，元兽王国：${m2.length}`);
        for (let i = 0; i < metamons.length; i++) {
            let m = metamons[i];
            if (m.allowUpper) {
                // console.log("元兽#"+m.id+"属性升级，能力:"+m.sca);
                let nftId = m.id;
                let attrType = getUpperAttType(m);
                let result = await metamonApi.addAttr(nftId, attrType);
                if (result.result == -1) {
                    console.log(`元兽${m.id}升级失败，原因：${result.message}`);
                } else {
                    let data = result.data;
                    if (data.upperSca > data.sca) {
                        console.log("元兽#" + m.id + "属性升级成功\n能力: " + data.sca + "->" + data.upperSca + "\n" + getAttTypeName(attrType) + ": " + data.attrNum + "->" + data.upperAttrNum);
                    } else {
                        console.log("元兽#" + m.id + "属性升级失败");
                    }
                }
                
                isUpper = 1;
            }
            await wait(500);
        }
        if (isUpper == 1) {
            console.log("所有元兽属性升级完毕！");
        } else {
            console.log("当前无元兽可进行属性升级！");
        }
    } catch (e) {
        console.log(e);
    }

}

function getAttTypeName(type) {
    /// 攻击属性 - 智慧
    if (type == 3) {
        return '智慧';
    }
    /// 攻击属性 - 体型
    if (type == 4) {
        return '体型';
    }
    /// 防御属性 - 勇气
    if (type == 2) {
        return '勇气';
    }
    /// 防御属性 - 隐身/闪避
    if (type == 5) {
        return '隐身';
    }

    /// 运气
    if (type == 1) {
        return '运气';
    }
    return '';
}

function getUpperAttType(metamon) {

    if (config.upperAttrType == 1) {
        /// 攻击属性 - 智慧
        if (metamon.inte < metamon.inteMax) {
            return 3;
        }
        /// 攻击属性 - 体型
        if (metamon.con < metamon.conMax) {
            return 4;
        }
        /// 防御属性 - 勇气
        if (metamon.crg < metamon.crgMax) {
            return 2;
        }
        /// 防御属性 - 隐身/闪避
        if (metamon.inv < metamon.invMax) {
            return 5;
        }
        /// 运气
        if (metamon.luk < metamon.lukMax) {
            return 1;
        }
        return 0;

    } else if (config.upperAttrType == 2) {
        /// 防御属性 - 勇气
        if (metamon.crg < metamon.crgMax) {
            return 2;
        }
        /// 防御属性 - 隐身/闪避
        if (metamon.inv < metamon.invMax) {
            return 5;
        }
        /// 攻击属性 - 智慧
        if (metamon.inte < metamon.inteMax) {
            return 3;
        }
        /// 攻击属性 - 体型
        if (metamon.con < metamon.conMax) {
            return 4;
        }
        /// 运气
        if (metamon.luk < metamon.lukMax) {
            return 1;
        }
        return 0;

    } else {
        /// 运气
        if (metamon.luk < metamon.lukMax) {
            return 1;
        }
        /// 攻击属性 - 智慧
        if (metamon.inte < metamon.inteMax) {
            return 3;
        }
        /// 攻击属性 - 体型
        if (metamon.con < metamon.conMax) {
            return 4;
        }
        /// 防御属性 - 勇气
        if (metamon.crg < metamon.crgMax) {
            return 2;
        }
        /// 防御属性 - 隐身/闪避
        if (metamon.inv < metamon.invMax) {
            return 5;
        }
        return 0;
    }


}

/// 获取特定NFT
async function getNft(bpType, metamonApi) {
    let nfts = await metamonApi.checkBag();
    let nft;
    for (let i = 0; i < nfts.length; i++) {
        let item = nfts[i];
        if (item.bpType == bpType) {
            nft = item;
            break;
        }
    }
    return nft;
}


run();